package com.qf.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author sunyamei
 * @version V1.0
 * @Project spring_demo
 * @Package com.qf.config
 * @Description:
 * @Date 2022/7/12 19:31
 */
@Aspect
@Component
public class AopConfig {

    //切入点表达式
    @Pointcut("execution(* com.qf.service.Impl.*.*(..))")
    public void pc(){

    }

    //通知 增强

    //    @Before("pc()")//前置通知
//    public void before(){
//        System.out.println("在方法执行之前执行");
//    }
//
//    @After("pc()")//最终通知
//    public void after(){
//        System.out.println("在方法执行之后执行001");
//    }
//
//    @AfterReturning("pc()")//后置通知  没有异常执行 有异常不执行
//    public void afterReturning(){
//        System.out.println("在方法执行之后执行002");
//    }
//
//    @AfterThrowing("pc()")//异常通知
//    public void afterThrowing(){
//        System.out.println("在出现异常时执行");
//    }
    //环绕增强：调用原始方法（如果不调用原始方法则原始方法不执行）
    //ProceedingJoinPoint 连接点对象（被拦截的方法）
    @Around("pc()")
    public Object around(ProceedingJoinPoint joinPoint){

        try {
            System.out.println("前置");
            //调用方法
            Object result = joinPoint.proceed();
            System.out.println("后置");
            return result;
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("异常");
        } finally {
            System.out.println("最终");

        }
        return  null;
    }
}

